Fix page-table dump on PAE with >4GB MFNs.
authorsmh22@firebug.cl.cam.ac.uk <smh22@firebug.cl.cam.ac.uk>
Thu, 10 Nov 2005 18:32:09 +0000 (19:32 +0100)
committersmh22@firebug.cl.cam.ac.uk <smh22@firebug.cl.cam.ac.uk>
Thu, 10 Nov 2005 18:32:09 +0000 (19:32 +0100)
Signed-off-by: Steven Hand <steven@xensource.com>
linux-2.6-xen-sparse/arch/xen/i386/mm/fault.c

index 269003960e54249fdc37fd2332878350935a5115..5d924a0bcf92d88084d072163e8968cc7e51b03e 100644 (file)
@@ -208,6 +208,7 @@ fastcall void do_invalid_op(struct pt_regs *, unsigned long);
 static void dump_fault_path(unsigned long address)
 {
        unsigned long *p, page;
+        unsigned long mfn; 
 
        preempt_disable();
        page = __pa(per_cpu(cur_pgd, smp_processor_id()));
@@ -217,20 +218,22 @@ static void dump_fault_path(unsigned long address)
        p += (address >> 30) * 2;
        printk(KERN_ALERT "%08lx -> *pde = %08lx:%08lx\n", page, p[1], p[0]);
        if (p[0] & 1) {
-               page = p[0] & PAGE_MASK;
-               address &= 0x3fffffff;
-               page = machine_to_phys(page);
+                mfn  = (p[0] >> PAGE_SHIFT) | ((p[1] & 0x7) << 20); 
+               page = mfn_to_pfn(mfn) << PAGE_SHIFT; 
                p  = (unsigned long *)__va(page);
+               address &= 0x3fffffff;
                p += (address >> 21) * 2;
-               printk(KERN_ALERT "%08lx -> *pme = %08lx:%08lx\n", page, p[1], p[0]);
+               printk(KERN_ALERT "%08lx -> *pme = %08lx:%08lx\n", 
+                       page, p[1], p[0]);
 #ifndef CONFIG_HIGHPTE
                if (p[0] & 1) {
-                       page = p[0] & PAGE_MASK;
-                       address &= 0x001fffff;
-                       page = machine_to_phys(page);
-                       p  = (unsigned long *) __va(page);
-                       p += (address >> 12) * 2;
-                       printk(KERN_ALERT "%08lx -> *pte = %08lx:%08lx\n", page, p[1], p[0]);
+                        mfn  = (p[0] >> PAGE_SHIFT) | ((p[1] & 0x7) << 20); 
+                        page = mfn_to_pfn(mfn) << PAGE_SHIFT; 
+                        p  = (unsigned long *) __va(page);
+                        address &= 0x001fffff;
+                        p += (address >> 12) * 2;
+                       printk(KERN_ALERT "%08lx -> *pte = %08lx:%08lx\n", 
+                               page, p[1], p[0]);
                }
 #endif
        }